package com.demo.boss.tools;

import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 定义一个公共类 RedisHelper，用于封装Redis操作
 */
public class RedisHelper {
    // 声明StringRedisTemplate对象，用于操作Redis字符串类型数据 初始值设为null，将在构造方法中初始化
    private StringRedisTemplate template = null;
    // 声明ValueOperations对象，用于操作Redis的字符串键值对
    private ValueOperations<String, String> valOps = null;
    // 声明HashOperations对象，用于操作Redis的哈希类型数据
    private HashOperations<String, Object, Object> hashOps = null;
    ListOperations<String,String> listOps = null;

    // 构造方法，接收StringRedisTemplate参数并初始化成员变量
    public RedisHelper(StringRedisTemplate stringRedisTemplate) {
        // 初始化template变量
        template = stringRedisTemplate;
        // 获取字符串操作对象并赋值给valOps
        valOps = stringRedisTemplate.opsForValue();
        // 获取哈希操作对象并赋值给hashOps
        hashOps = stringRedisTemplate.opsForHash();
        listOps = stringRedisTemplate.opsForList();
    }

    // 存储哈希类型数据，并设置过期时间的方法
    // 参数：key-键名，data-要存储的哈希数据，timeUnit-时间单位，timeout-过期时间
    // 返回值：boolean-操作是否成功
    public boolean setHashAll(String key, Map<String, String> data, TimeUnit timeUnit, Integer timeout) {
        // 设置 key 过期时间
        if (timeout > 0) {
            hashOps.putAll(key,data);
            return template.expire(key,timeout,timeUnit);
        }
        return false;
    }
    // 参数：key-键名，data-要存储的哈希数据
    public void setHashAll(String key,Map<String,String> data){
        hashOps.putAll(key,data);
    }
    public void setValue(String key,String val){
        valOps.set(key,val);
    }
    public String getVal(String key){
        return valOps.get(key);
    }
    // list 类型
    public void addListElement(String key,String json){
        listOps.rightPush(key, json);
    }
    public List<String> getListElement(String key, int start, int end){
        return listOps.range(key,start,end);
    }
}
